package com.exchange.common;


import java.util.List;
import java.util.Set;

import com.exchange.route.AdminRoute;
import com.exchange.route.FrontRoute;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.plugin.redis.serializer.JdkSerializer;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;

import it.sauronsoftware.cron4j.ProcessTask;

/**
 * 
 * 
 * API 引导式配置
 */
public class ExchangeConfig extends JFinalConfig {
	
	static Prop p;
	
	/**
	 * 启动入口，运行此 main 方法可以启动项目，此 main 方法可以放置在任意的 Class 类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		UndertowServer.start(ExchangeConfig.class,8888,true);
	}
	
	/**
	 * PropKit.useFirstFound(...) 使用参数中从左到右最先被找到的配置文件
	 * 从左到右依次去找配置，找到则立即加载并立即返回，后续配置将被忽略
	 */
	static void loadConfig() {
		if (p == null) {
			p = PropKit.useFirstFound("config-pro.properties", "config-dev.properties");
		}
	}
	
	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		loadConfig();
		
		me.setDevMode(p.getBoolean("devMode", false));
		me.setMaxPostSize(1024 * 1024 * 1000 * 10);
		/**
		 * 支持 Controller、Interceptor、Validator 之中使用 @Inject 注入业务层，并且自动实现 AOP
		 * 注入动作支持任意深度并自动处理循环注入
		 */
		me.setInjectDependency(true);
		
		// 配置对超类中的属性进行注入
		me.setInjectSuperClass(true);
	}
	
	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add(new AdminRoute()); // 后端路由
        me.add(new FrontRoute()); // 前端路由
	}
	
	public void configEngine(Engine me) {
		
	}
	
	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置 druid 数据库连接池插件,换一个线程池
//		DruidPlugin druidPlugin = new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
//		druidPlugin.addFilter(new StatFilter());
//        WallFilter wall = new WallFilter();   // 加强数据库安全
//        wall.setDbType("mysql");
//        druidPlugin.addFilter(wall);
//        druidPlugin.setMaxWait(300000);
//        druidPlugin.addFilter(new StatFilter());    // 添加 StatFilter 才会有统计数据
//        me.add(druidPlugin);
        //DbKit.getConfig().getConnection();判断数据库是否连接成功
        
		// 配置ActiveRecord插件
//		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
//		ActiveRecordPlugin.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);//事务锁级别
//		arp.setShowSql(true);
//        arp.setBaseSqlTemplatePath(PathKit.getRootClassPath() + "/sql/");
//        arp.addSqlTemplate("include.sql");
//        arp.getSqlKit().getEngine().addSharedObject("str", new StrKit());
		// 所有映射在 MappingKit 中自动化搞定
//		_MappingKit.mapping(arp);
//		me.add(arp);
		
//		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
//		arp.addSqlTemplate("all.sql");
//		_MappingKit.mapping(arp);
//		me.add(arp);
		
		
		// 配置ShiroPlugin插件
//        ShiroPlugin shiroPlugin = new ShiroPlugin();
//        shiroPlugin.setLoginUrl("/admin/login");//登陆url：未验证成功跳转
//        shiroPlugin.setUnauthorizedUrl("/admin/error");//授权url：未授权成功自动跳转
//        me.add(shiroPlugin);
		
		// 配置EhCachePlugin插件
//        me.add(new EhCachePlugin());
        
        // tio websocket
//        me.add(new WebsocketStarter());

        // 配置定时任务插件
//        Cron4jPlugin cron4 = new Cron4jPlugin("task.properties");
//        me.add(cron4);
        
//        Cron4jPlugin cron4jPlugin = new Cron4jPlugin();
//        String[] command = { "C:\\tomcat\\bin\\catalina.bat", "start" };
//        String[] envs = { "CATALINA_HOME=C:\\tomcat", "JAVA_HOME=C:\\jdks\\jdk5" };
//        File directory = new File("C:\\MyDirectory");
//        ProcessTask task = new ProcessTask(command, envs, directory);
//        cron4jPlugin.addTask("task", task);
//        me.add(cron4jPlugin);
        
        // 内存储存登录用户信息
        RedisPlugin appUserRedis = new RedisPlugin(p.get("redisName"), p.get("redisHost"), p.getInt("redisPort"));
//        appUserRedis.setSerializer(JdkSerializer.me); // 需要使用fst高性能序列化的用户请删除这一行（Fst jar依赖请查看WIKI）
        me.add(appUserRedis);
     
//        RedisPlugin appUserTokenRedis = new RedisPlugin("appUserToken", "127.0.0.1");
//        appUserRedis.setSerializer(JdkSerializer.me); // 需要使用fst高性能序列化的用户请删除这一行（Fst jar依赖请查看WIKI）
//        me.add(appUserTokenRedis);  
//        //用于缓存用户unionid和设备id
//        RedisPlugin unionidRedis = new RedisPlugin("unionidANDid", "127.0.0.1");
//        unionidRedis.setSerializer(JdkSerializer.me);
//        me.add(unionidRedis);
        
        
        //kafka
//		KafkaPlugin kafkaPlugin = new KafkaPlugin();
//		me.add(kafkaPlugin); 
//		ThreadPoolPlugin threadPoolPlugin = new ThreadPoolPlugin(0, 0, 0, 0);
//		me.add(threadPoolPlugin); 
        
	}
	
	public static DruidPlugin createDruidPlugin() {
		loadConfig();
		
		return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password").trim());
	}
	
	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		
	}
	
	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		
	}
	
	public void onStart() {
		
		Cache redis = Redis.use();
		System.out.println(redis.ping());
		redis.set("newTick:wtewte:qw", 34);
		redis.set("newTick:wtewte:qe", 35);
		redis.set("newTick:wtew:qr", 36);
		Set l = redis.keys("newTick*");
		List c = redis.hvals("newTick*");
		System.out.println(l);
		System.out.println(c);
//		Record r1 = new Record();
//		r1.set("1", 1);
//		r1.set("2", 2);
//		Record r2 = new Record();
//		r2.set("1", 1);
//		r2.set("2", 2);
//		List<Record> rl = new ArrayList<Record>();
//		rl.add(r1);
//		rl.add(r2);
//		Page<Record> rp = new Page<Record>();
//		rp.setList(rl);
//		System.out.println(rp.getList());
//		for (Record record : rp.getList()) {
//			record.set("3", 3);
//		}
//		System.out.println(rp.getList());
		

//		Long lo = Redis.use("ws").sadd("1111", 1,2,3,4,5,6);
//		System.out.println(lo);
//		Set l = Redis.use("ws").smembers("1111");
//		System.out.println(l);
//	    Boolean b = Redis.use("ws").sismember("1111",7);
//	    System.out.println(b);
		
		
//		JetInstance instance = Jet.newJetInstance();
		
	}
	 
	// 系统关闭之前回调
	public void onStop() {
		
	}
	
	
}
